package com.kaf.common.util;

import java.util.regex.Pattern;

/**
 * 字符串工具类
 * 提供常见的字符串操作和验证方法
 */
public class StringUtil {

    /**
     * 手机号正则表达式
     */
    private static final Pattern PHONE_PATTERN = Pattern.compile("^1[3-9]\\d{9}$");

    /**
     * 邮箱正则表达式
     */
    private static final Pattern EMAIL_PATTERN = Pattern.compile("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");

    /**
     * 判断字符串是否为空（null或空字符串）
     * @param str 待检查字符串
     * @return 是否为空
     */
    public static boolean isEmpty(String str) {
        return str == null || str.trim().isEmpty();
    }

    /**
     * 判断字符串是否非空
     * @param str 待检查字符串
     * @return 是否非空
     */
    public static boolean isNotEmpty(String str) {
        return !isEmpty(str);
    }

    /**
     * 判断字符串是否为数字
     * @param str 待检查字符串
     * @return 是否为数字
     */
    public static boolean isNumeric(String str) {
        if (isEmpty(str)) {
            return false;
        }
        return str.matches("-?\\d+(\\.\\d+)?");
    }

    /**
     * 验证手机号格式
     * @param phone 手机号
     * @return 是否有效
     */
    public static boolean isValidPhone(String phone) {
        return isNotEmpty(phone) && PHONE_PATTERN.matcher(phone).matches();
    }

    /**
     * 验证邮箱格式
     * @param email 邮箱
     * @return 是否有效
     */
    public static boolean isValidEmail(String email) {
        return isNotEmpty(email) && EMAIL_PATTERN.matcher(email).matches();
    }

    /**
     * 隐藏手机号中间四位
     * @param phone 手机号
     * @return 隐藏后的手机号
     */
    public static String hidePhone(String phone) {
        if (!isValidPhone(phone)) {
            return phone;
        }
        return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
    }

    /**
     * 截取字符串，如果超过指定长度则添加省略号
     * @param str 原始字符串
     * @param maxLength 最大长度
     * @return 截取后的字符串
     */
    public static String truncate(String str, int maxLength) {
        if (isEmpty(str) || str.length() <= maxLength) {
            return str;
        }
        return str.substring(0, maxLength) + "...";
    }

    /**
     * 将下划线命名转换为驼峰命名
     * @param underscoreName 下划线命名
     * @return 驼峰命名
     */
    public static String underscoreToCamelCase(String underscoreName) {
        if (isEmpty(underscoreName)) {
            return underscoreName;
        }

        StringBuilder result = new StringBuilder();
        String[] parts = underscoreName.split("_");
        for (String part : parts) {
            if (part.length() > 0) {
                if (result.length() == 0) {
                    result.append(part.toLowerCase());
                } else {
                    result.append(part.substring(0, 1).toUpperCase())
                            .append(part.substring(1).toLowerCase());
                }
            }
        }
        return result.toString();
    }

    /**
     * 将驼峰命名转换为下划线命名
     * @param camelCaseName 驼峰命名
     * @return 下划线命名
     */
    public static String camelCaseToUnderscore(String camelCaseName) {
        if (isEmpty(camelCaseName)) {
            return camelCaseName;
        }

        StringBuilder result = new StringBuilder();
        for (int i = 0; i < camelCaseName.length(); i++) {
            char c = camelCaseName.charAt(i);
            if (Character.isUpperCase(c) && i > 0) {
                result.append('_');
            }
            result.append(Character.toLowerCase(c));
        }
        return result.toString();
    }
}
